#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>

int CrearSocketServidor(int puerto){
/*
	struct in_addr{
		unsigned long s_addr;
	};

	struct struct_sockaddr_in{
		short int sin_family;
		unsigned short int sin_port;
		struct in_addr sin_addr;
		unsigned char sin_zero[8];
	};
*/	int sockId;
	struct sockaddr_in sock_in;


	sockId = socket(AF_INET, SOCK_STREAM, 0);
	if(sockId == -1){
		//Log error
		perror("SocketServer");
		return -1;
	}

	sock_in.sin_family = AF_INET;
	sock_in.sin_port = htons(puerto);
	sock_in.sin_addr.s_addr = inet_addr("10.0.2.15");//usa mi direccion de ip
	memset(&(sock_in.sin_zero), '\0', 8);

	//int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
	if(bind(sockId, (struct sockaddr *)&sock_in, sizeof(struct sockaddr_in)) == -1){
		//Logerror
		perror("SocketServidor");
		//close(sockId);
		return -1;
	}

	//int listen(int sockfd, int backlog);//backlog es la cantidad de conexiones que pueden haber en cola esperando por el accept
	if(listen(sockId, 10) == -1){
		//Logerror
		perror("SocketServidor");
		close(sockId);
		return -1;
	}

	return sockId;
}


//en sock_in me va a guardar la ip y puerto del que se este conectando a nuestro proceso,
//esto nos va a servir para cuando hayamos terminado de procesar la informacion
//que nos pidio ese cliente, podamos enviarle a traves de un nuevo socket
//la respuesta al mismo, ya que una vez que me llega la peticion, el cliente
//deja de escuchar en ese socket.
int AceptarConexion(int serverSock){
	int newSock = 0;
	struct sockaddr_in sock_in;
	int sock_in_size;

	sock_in_size = sizeof(struct sockaddr_in);
	newSock = accept(serverSock, (struct sockaddr *)&sock_in, &sock_in_size);

	//newSock = accept(serverSock, NULL, NULL);

	if(newSock == -1){
		//LogError
		perror("Accept");
		return -1;
	}

	return newSock;
}


